Network based storage (or simply, “network storage”) is a common approach for backing up data, making large amounts of data accessible to multiple users, and other purposes. A storage server is a type of storage controller used in a network storage environment to make data available to client (host) systems, by presenting or exporting to the clients one or more logical containers of data. There are various forms of network storage, including network attached storage (NAS) and storage area network (SAN). In a NAS context, a storage server services file-level requests from clients, whereas in a SAN context a storage server services block-level requests. Some storage servers are capable of servicing both file-level requests and block-level requests.
In conventional network storage systems, a storage server maintains data in a main (persistent) storage subsystem, which may be organized into one or more groups of storage devices such as hard disk drives (HDDs). A storage server also typically uses its internal memory as a cache, sometimes called a “buffer cache”, to reduce latency in servicing read and write requests from a client's perspective. In conventional storage servers, the buffer cache is commonly implemented as dynamic random access memory (DRAM). Various cache content management techniques are also known in the art for improving “hit rate” and/or space utilization of a cache, to improve overall performance of the system.
While significant advances have been made in terms of reducing access latency in storage servers, larger and increasingly complex workloads experienced by today's storage servers demand continued improvement in this regard. In this regard, a more recent development in the art is to employ a secondary cache, or “victim cache”, that operates logically between the internal buffer cache (the primary cache) and the main storage subsystem. Data that are evicted from the internal buffer cache are generally stored in the victim cache whenever practical. A victim cache generally is larger and slower (in terms of access latency) than the internal buffer cache but smaller and faster than the main storage subsystem. In at least one known server system, the victim cache, like the internal buffer cache, is implemented in DRAM.
One problem with DRAM, however, is that it is relatively expensive. Flash memory is a potential alternative to DRAM for use as a victim cache. Flash memory is generally much less expensive than DRAM per unit storage, yet like DRAM, it has much faster random read access speed than conventional disk drives. Further, flash memory is not volatile like DRAM.
However, flash memory has certain characteristics that can interfere with conventional cache content management techniques for improving cache performance. Firstly, flash memory wears out after a finite number of program-erase cycles. Failure of a memory component that is being used to store critical software or data can be disastrous. Therefore, some flash memory devices employ a technique called wear leveling to spread the wear more evenly across an entire flash device, so that no particular portion of the device experiences substantially more wear (and therefore earlier failure) than any other portion. However, because wear leveling techniques place restrictions upon where data can be stored at any given point in time, these techniques can undermine or hinder cache content management techniques that are designed to improve cache performance.
Also, flash memory has “erase blocks”, where an erase block is the smallest unit of flash memory that can be erased at a time. Erase blocks are substantially larger than the smallest unit of memory that can be programmed. For example, NAND flash memory can be read or programmed in a random access fashion in units typically sized in the range of 2 KB to 4 KB, however, an erase block may be on the order of 256 KB. Furthermore, in order to rewrite any given byte in flash memory, the entire erase block that contains the byte must first be erased. Finally, to maximize data integrity in today's NAND flash memories, pages within an erase block need to be programmed in sequential order. These characteristics can further hinder cache content management techniques.